package top.gytf.distools.lifecycle;

import org.springframework.util.Assert;

/**
 * 生命周期
 */
public interface Lifecycle {
    /**
     * 名称
     */
    default String getName() {
        return getClass().getName();
    }

    /**
     * 断言管理器可用
     */
    default void assertReady() {
        Assert.isTrue(isReady(), getName() + " 未初始化");
    }

    /**
     * 是否可用
     * @return 当已初始化，但是未销毁时，返回{@code true}
     */
    default boolean isReady() {
        return isInitialized() && !isDestroyed();
    }

    /**
     * 是否已初始化
     */
    boolean isInitialized();

    /**
     * 初始化，如果已初始化，但是重复调用请勿抛出任何异常
     */
    void initialize();

    /**
     * 是否已销毁
     */
    boolean isDestroyed();

    /**
     * 销毁，如果已销毁，但是重复调用请勿抛出任何异常
     */
    void destroy();
}
